package com.qq.多线程.定时器;


import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;

/*
	定时器
	定时器是一种控制任务延时调用，或者周期调用的技术。
	作用：闹钟、定时邮件发送。
	
	定时器的实现方式
	方式一：Timer
	方式二：ScheduledExecutorService

	Timer构造器：
	public Timer() 创建Timer定时器对象

	方法：
	public void schedule​(TimerTask task, long delay, long period)	
	开启一个定时器，按照计划处理TimerTask任务
	参数1：TimerTask任务对象
	参数2：任务开始延迟时间  单位毫秒
	参数3：任务执行周期时间  单位毫秒
	
	Timer定时器的特点和存在的问题：
	虽然主线程一开始就会把所有任务交给Timer，
	但Timer是单线程，只能一个一个的处理任务，其他任务只能排队
	1.如果某个任务的耗时过长，其他任务就无法在规定的时间调用。
	2.如果某个任务出现异常导致Timer线程被虚拟机挂掉且无法恢复，其他任务将无法执行。
  
    目标：Timer定时器的使用和了解。
 */
public class Timer_Test {
    public static void main(String[] args) {
        // 1、创建Timer定时器
        Timer timer = new Timer();  // 定时器本身就是一个单线程。
        
        // 2、调用方法，处理定时任务
//      TimerTask是实现Runnable接口的任务类，用于定时器。
        timer.schedule(new TimerTask() {//它是只有一个抽象方法的抽象类，可以写成匿名内部类的形式。
            @Override
            public void run() {//任务执行时间过长
                System.out.println(Thread.currentThread().getName() + "执行AAA~~~" + new Date());
                try {
                    Thread.sleep(5000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }, 0, 2000);
        System.out.println("hh");

//        timer.schedule(new TimerTask() {//任务出现异常
//            @Override
//            public void run() {
//                System.out.println(Thread.currentThread().getName() + "执行BB~~~"+ new Date());
//                System.out.println(10/0);
//            }
//        }, 0, 2000);

        timer.schedule(new TimerTask() {
            @Override
            public void run() {
                System.out.println(Thread.currentThread().getName() + "执行CCC~~~"+ new Date());
            }
        }, 0, 3000);
    }
}
